package cn.wolfcode.luowowo.service.impl;

import cn.wolfcode.luowowo.domain.UserInfo;
import cn.wolfcode.luowowo.exception.LogicException;
import cn.wolfcode.luowowo.redis.RedisKey;
import cn.wolfcode.luowowo.redis.srevice.IUserRedisSrevice;
import cn.wolfcode.luowowo.repository.UserInfoRepository;
import cn.wolfcode.luowowo.service.IAccessService;
import cn.wolfcode.luowowo.service.IUserInfoService;
import cn.wolfcode.luowowo.util.AssertUtil;
import cn.wolfcode.luowowo.util.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.TimeUnit;

@Service
public class AccessServiceImpl implements IAccessService {
    @Autowired
    private UserInfoRepository repository;

    @Autowired
    private StringRedisTemplate redisTemplate;
    
    //获取今日的访问用户
    @Override
    public List<UserInfo> getAccess(String user) {
        
        List<UserInfo> list = new ArrayList<>();
        
        //拼接出key
        String key = RedisKey.USER_ACCESS_KEY.join(user);
        //获取集合中的访问用户的key 前8个
        List<String> keys = redisTemplate.opsForList().range(key, 0, 7);
        
        //循环一下
        for (String s : keys) {
            UserInfo userInfos = repository.findById(s).get();
            //拼接进去
            list.add(userInfos);
        }
        return list;
    }
    
    //获取所有的访问人员
    @Override
    public List<UserInfo> getAccessSum(String user) {
        List<UserInfo> list = new ArrayList<>();
        
        UserInfo userInfo = repository.findById(user).get();
        List<String> access = userInfo.getAccess();
        
        //循环一下
        for (String s : access) {
            UserInfo userInfo1 = repository.findById(s).get();
            list.add(userInfo1);
        }
        return list;
    }
    
    //获取所有的访问用户人数
    @Override
    public int getAccessNum(String user) {
        UserInfo userInfo = repository.findById(user).get();
        return userInfo.getAccessNum();
    }
    
    //获取今天的访问用户数
    @Override
    public Long getAccessNumDay(String user) {
        String key = RedisKey.USER_ACCESS_KEY.join(user);
        //获取今天的访问人数数组的长度
        Long size = redisTemplate.opsForList().size(key);
        return size;
    }
    
    //添加访问者的id
    @Override
    public void setAccess(String id, String user) {
        //查询作者的数据
        UserInfo userInfo = repository.findById(user).get();
        //获取mongo里面的访问用户id集合
        List<String> access = userInfo.getAccess();
        
        
        //首先判断这个key是否存在
        String accessKey = RedisKey.USER_ACCESS_KEY.join(user);
        if (redisTemplate.hasKey(accessKey)) {
            //获取redis中的集合 不管里面有没有值 都可以用来判断
            List<String> userList = redisTemplate.opsForList().range(accessKey, 0, -1);
            //判断访问人员的信息是否存在list中
            if (!userList.contains(id)) {
                //不存在就将用户新增进redis中
                redisTemplate.opsForList().rightPush(accessKey, id);
                //固化到mongo的访客集合中
                access.add(id);
                //给总访问数+1
                userInfo.setAccessNum(userInfo.getAccessNum() + 1);
            }
        } else {
            //不存在就建立新的访问人数   并且总访问人数 +1  并且设置时限
            redisTemplate.opsForList().rightPush(accessKey, id);
            
            //设置一个时间戳
            Date now = new Date();
            //设置一个时间在当前时间到今天的最后一秒
            Date enw = DateUtil.getEndDate(now);
            //调用老师给的时间算法 得出到今天最后一秒的相差时间
            long time = DateUtil.getDateBetween(enw, now);
            //设置过期时间
            redisTemplate.expire(accessKey, time, TimeUnit.SECONDS);
    
            //固化到mongo的访客集合中
            access.add(id);
            //给总访问数+1
            userInfo.setAccessNum(userInfo.getAccessNum() + 1);
        }
        
        //将修改后的值重新传回数据库
        repository.save(userInfo);
    }
}
